
import {
	ICtrlAbility,
	IViewAbility,
	IViewController,
	IViewStore,
} from '@/core';
import { UILogicParamType } from '../const/ui-logic-param-type';
import { UILogicParamBase } from './ui-logic-param-base';

/**
 * 当前视图
 *
 * @export
 * @class UILogicActiveViewParam
 */
export class UILogicActiveViewParam extends UILogicParamBase {
	/**
	 * Creates an instance of UILogicActiveViewParam.
	 * @param {*} opts
	 * @memberof UILogicActiveViewParam
	 */
	public constructor(opts: any) {
		super(opts);
	}

	/**
	 * 初始化
	 *
	 * @protected
	 * @memberof UILogicActiveViewParam
	 */
	protected init(params: any) {
		this.logicParamType = UILogicParamType.activeViewParam;
		this.setReal(this.getActiveView(params));
	}

	/**
	 * 获取激活视图
	 *
	 * @private
	 * @param {any} params
	 * @memberof UILogicActiveViewParam
	 */
	private getActiveView(params: any) {
		const { actionContext } = params;
		if (actionContext && actionContext.viewCtx && actionContext.viewCtx.view) {
			return actionContext.viewCtx.view;
		} else {
			return null;
		}
	}

	/**
	 * 获取指定属性值(获取当前视图指定名称部件)
	 *
	 * @param {string} strName
	 * @memberof UILogicActiveViewParam
	 */
	public get(strName: string) {
		const ability = this.actionSession.additionalParam.actionContext;
		if (ability && ability.viewCtx && ability.viewCtx.view) {
			const view = ability.viewCtx.view;
			let ctrl = (
				view as IViewController<IViewStore, IViewAbility>
			).getSubAbility<ICtrlAbility>(strName.toLowerCase());
			if (ctrl) {
				return ctrl;
			} else {
				// 视图布局面板获取
				if (Object.is(ability.controller.type, 'VIEWLAYOUT')) {
					const layoutDetailsModel =
						ability.controller.panel.getLayoutModelDetails();
					const { data } = this.actionSession.additionalParam;
					// 多数据域
					if (layoutDetailsModel) {
						if (data[0] && data[0].hasMulParent) {
							ctrl =
								ability.layoutDetailsModel[
									`${strName.toLowerCase()}_${data[0].index}`
								];
						} else {
							ctrl = ability.layoutDetailsModel[strName.toLowerCase()];
						}
					}
					if (ctrl) {
						return ctrl;
					} else if(view[strName]){
						return view[strName];
					}else {
						throw new Error(`逻辑参数${this.strCodeName}无法找到指定部件`);
					}
				} else {
					throw new Error(`逻辑参数${this.strCodeName}无法找到指定部件`);
				}
			}
		}
	}

	/**
	 * 重置指定属性
	 *
	 * @param {string} strName
	 * @memberof UILogicActiveViewParam
	 */
	public reset(strName: string) {
		throw new Error(
			`逻辑参数${this.strCodeName}为当前视图类型，无法重置指定属性`
		);
	}

	/**
	 * 重置全部
	 *
	 * @memberof UILogicActiveViewParam
	 */
	public resetAll() {
		throw new Error(`逻辑参数${this.strCodeName}为当前视图类型，无法重置全部`);
	}

	/**
	 * 拷贝当前变量到指定变量
	 *
	 * @param {*} dstParam
	 * @memberof UILogicActiveViewParam
	 */
	public copyTo(dstParam: any) {
		throw new Error(
			`逻辑参数${this.strCodeName}为当前视图类型，无法拷贝当前变量到指定变量`
		);
	}

	/**
	 * 绑定指定参数对象
	 *
	 * @param {*} opts
	 * @memberof UILogicActiveViewParam
	 */
	public bind(opts: any) {
		throw new Error(
			`逻辑参数${this.strCodeName}为当前视图类型，无法绑定指定参数对象`
		);
	}

	/**
	 * 重新建立参数对象
	 *
	 * @memberof UILogicActiveViewParam
	 */
	public renew() {
		throw new Error(
			`逻辑参数${this.strCodeName}为当前视图类型，无法重新建立参数对象`
		);
	}
}
